home *** CD-ROM | disk | FTP | other *** search
/ Shareware Extravaganza - Disc 1 / ShareWare Extravaganza 1 of 4 (The Ultimate Shareware Company).iso / grprogs / picutil.exe / MIRROR.ASM < prev    next >
Assembly Source File  |  1986-06-11  |  19KB  |  477 lines

  1. ;╔═════════════════════════════════════════════════════════════════════════════╗
  2. ;║ ░░░░░░░░░░░ PROGRAM = PIC2IMG.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  3. ;╚═════════════════════════════════════════════════════════════════════════════╝
  4. CSEG           SEGMENT PUBLIC BYTE
  5.            ASSUME  CS:CSEG,DS:CSEG
  6.  
  7. CR           EQU     0DH
  8. LF           EQU     0AH
  9.  
  10. FILENAME       DB      128 DUP(0)
  11. GMI           DB      'GMI',0
  12. IMG           DB      'IMG',0
  13. HANDLE_IN      DW      0
  14. HANDLE_OUT     DW      0
  15. TYPE_FROM      DW      0
  16. BUFF_SIZE      DW      0
  17.  
  18. LINES_PER_BUFF DW      0
  19. NUMBER_READS   DW      0
  20.  
  21. DISK_BUFFER    DD      0
  22.  
  23. ;44 BYTES
  24. IMG_NAME       DB      'FILE GENERATED FROM PCPAINT   '
  25. IMG_HEIGHT     DW      0
  26. IMG_WIDTH      DW      0
  27. IMG_WIDTH_BYTE DW      0
  28. IMG_PIX_SIZE   DW      1
  29. IMG_PIX_FMT    DW      0
  30. IMG_COLOR      DW      0
  31. IMG_COMPRESS   DW      0
  32.  
  33. FLAGS           DW      0
  34. GMI_FILE       EQU     1
  35.  
  36. TELL_HOW       DB      '┌──────────────────────────────────────────────┐',cr,lf
  37.            DB      '│ MIRROR filename.typ                          │',cr,lf
  38.            DB      '├──────────────────────────────────────────────┤',cr,lf
  39.            DB      '│ filename = IMG or GMI format picture         │',cr,lf
  40.            DB      '│ typ      = must end in IMG or GMI            │',cr,lf
  41.            DB      '├──────────────────────────────────────────────┤',cr,lf
  42.            DB      '│ Converts GMI file to IMG file                │',cr,lf
  43.            DB      '│ Converts IMG file to GMI file                │',cr,lf
  44.            DB      '│ IMG file is CLR image format                 │',cr,lf
  45.            DB      '│ GMI is IMG file with vertical scan lines     │',cr,lf
  46.            DB      '│  reversed (mirror effect)                    │',cr,lf
  47.            DB      '└──────────────────────────────────────────────┘',cr,lf
  48.            DB      7,'$'
  49. OPEN_ERROR     DB      'file not found...must end in IMG or GMI',cr,lf,'$'
  50. CREATE_ERROR   DB      'create error on output file',cr,lf,'$'
  51. ;╔═════════════════════════════════════════════════════════════════════════════╗
  52. ;║ ░░░░░░░░░░░ MAIN.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  53. ;╚═════════════════════════════════════════════════════════════════════════════╝
  54. MAIN           PROC    FAR
  55. ;┌─────────────────────────────────────────────────────────────────────────────┐
  56. ;│           RETURN SETUP                               │
  57. ;└─────────────────────────────────────────────────────────────────────────────┘
  58.            CLI
  59.            MOV     AX,CS               ;TEMP STACK
  60.            MOV     SS,AX               ;
  61.            MOV     ES,AX               ;
  62.            MOV     SP,OFFSET STACK           ;
  63.            STI
  64.            PUSH    DS               ;
  65.            XOR     AX,AX               ;
  66.            PUSH    AX               ;
  67.            CLD
  68. ;┌─────────────────────────────────────────────────────────────────────────────┐
  69. ;│           GET FILENAME FROM COMMAND LINE                       │
  70. ;└─────────────────────────────────────────────────────────────────────────────┘
  71.            MOV     SI,82H               ;START OF FILENAME
  72.            XOR     CH,CH               ;
  73.            MOV     CL,DS:[SI-2]           ;SIZE OF FILENAME
  74.            CMP     CX,0               ;NO COMMANDS
  75.            JE      GFN800               ;ERROR
  76.            MOV     DI,OFFSET FILENAME      ;STORE FILENAME HERE
  77. GFN100:
  78.            LODSB                   ;GET CHARACTER
  79.            CMP     AL,20H               ;END OF FILENAME?
  80.            JE      GFN900               ;YES....BRANCH
  81.            CMP     AL,CR               ;END OF COMMAND LINE?
  82.            JE      GFN900               ;YES....ERROR
  83.            STOSB                   ;SAVE CHARACTER
  84.            CMP     AL,'.'                  ;START OF TYPE
  85.            JNE     GFN200               ;
  86.            MOV     CS:TYPE_FROM,DI           ;START OF TYPE
  87. GFN200:
  88.            LOOP    GFN100               ;GET ANOTHER CHARACTER
  89.            JMP     SHORT GFN800           ;ERROR IF DONE ALREADY
  90. GFN800:
  91.            MOV     DX,OFFSET TELL_HOW      ;
  92.            JMP     ERROR               ;
  93. GFN900:
  94.            MOV     AL,0               ;PUT NULL AT END OF STRING
  95.            STOSB                   ;
  96.            CMP     WORD PTR CS:TYPE_FROM,0 ;
  97.            JNE     SET_BREAK
  98.            DEC     DI
  99.            MOV     CS:TYPE_FROM,DI
  100. ;┌─────────────────────────────────────────────────────────────────────────────┐
  101. ;│           TURN BREAK KEY ON                           │
  102. ;└─────────────────────────────────────────────────────────────────────────────┘
  103. SET_BREAK:
  104.            MOV     AX,CS               ;SET DATA SEGMENT
  105.            MOV     DS,AX               ;
  106.            MOV     ES,AX
  107.            CALL    BREAK_ON            ;SET UP CONTROL BREAK
  108. ;┌─────────────────────────────────────────────────────────────────────────────┐
  109. ;│           FIND DISK MEMORY                            │
  110. ;└─────────────────────────────────────────────────────────────────────────────┘
  111.            MOV     AX,OFFSET PROG_END      ;
  112.            MOV     BX,CS               ;
  113.            SHR     AX,1               ;
  114.            SHR     AX,1               ;
  115.            SHR     AX,1               ;
  116.            SHR     AX,1               ;
  117.            ADD     BX,AX               ;
  118.            ADD     BX,8               ;
  119.            MOV     WORD PTR DISK_BUFFER+2,BX      ;
  120. ;┌─────────────────────────────────────────────────────────────────────────────┐
  121. ;│           CHECK  FILENAME                               │
  122. ;└─────────────────────────────────────────────────────────────────────────────┘
  123.            MOV     SI,OFFSET IMG           ;
  124.            MOV     DI,TYPE_FROM           ;
  125.            MOV     CX,3               ;
  126.            AND     BYTE PTR [DI],0DFH        ;MAKE CAPITOL LETTER
  127.            AND     BYTE PTR [DI+1],0DFH        ;MAKE CAPITOL LETTER
  128.            AND     BYTE PTR [DI+2],0DFH        ;MAKE CAPITOL LETTER
  129.            REP     CMPSB               ;
  130.            JE      OIF000
  131. ;┌─────────────────────────────────────────────────────────────────────────────┐
  132. ;│           CHECK  FILENAME                               │
  133. ;└─────────────────────────────────────────────────────────────────────────────┘
  134. CF100:
  135.            MOV     SI,OFFSET GMI           ;
  136.            MOV     DI,TYPE_FROM           ;
  137.            MOV     CX,3               ;
  138.            REP     CMPSB               ;
  139.            JNE     OIF050
  140.            OR      FLAGS,GMI_FILE
  141. ;┌─────────────────────────────────────────────────────────────────────────────┐
  142. ;│           OPEN INPUT FILE                               │
  143. ;└─────────────────────────────────────────────────────────────────────────────┘
  144. OIF000:
  145.            MOV     AH,3DH               ;OPEN FILE FOR READ
  146.            MOV     AL,0H               ;
  147.            MOV     DX,OFFSET FILENAME      ;
  148.            INT     21H               ;
  149.            JNC     OIF100
  150. OIF050:
  151.            MOV     DX,OFFSET OPEN_ERROR    ;
  152.            JMP     ERROR
  153. OIF100:
  154.            MOV     HANDLE_IN,AX
  155. ;┌─────────────────────────────────────────────────────────────────────────────┐
  156. ;│           CHANGE FILENAME                               │
  157. ;└─────────────────────────────────────────────────────────────────────────────┘
  158.            TEST    FLAGS,GMI_FILE
  159.            JE      CF300
  160.            MOV     SI,OFFSET IMG           ;CHANGE TYPE ON FILENAME
  161.            JMP     SHORT CF400
  162. CF300:
  163.            MOV     SI,OFFSET GMI
  164. CF400:
  165.            MOV     DI,TYPE_FROM           ;
  166.            MOV     CX,3               ;
  167.            REP     MOVSB               ;
  168. ;┌─────────────────────────────────────────────────────────────────────────────┐
  169. ;│           CREATE OUTPUT FILE                           │
  170. ;└─────────────────────────────────────────────────────────────────────────────┘
  171.            MOV     AH,3CH               ;
  172.            MOV     CX,20H               ;
  173.            MOV     DX,OFFSET FILENAME      ;
  174.            INT     21H               ;
  175.            JNC     COF100
  176.            MOV     DX,OFFSET CREATE_ERROR  ;
  177.            JMP     ERROR
  178. COF100:
  179.            MOV     HANDLE_OUT,AX
  180. ;┌─────────────────────────────────────────────────────────────────────────────┐
  181. ;│           READ IMG HEADER                               │
  182. ;└─────────────────────────────────────────────────────────────────────────────┘
  183.            MOV     AH,3FH
  184.            MOV     BX,HANDLE_IN
  185.            MOV     CX,44
  186.            MOV     DX,OFFSET IMG_NAME
  187.            INT     21H
  188. ;┌─────────────────────────────────────────────────────────────────────────────┐
  189. ;│           WRITE IMG HEADER                            │
  190. ;└─────────────────────────────────────────────────────────────────────────────┘
  191.            MOV     AH,40H
  192.            MOV     BX,HANDLE_OUT
  193.            MOV     CX,44
  194.            MOV     DX,OFFSET IMG_NAME
  195.            INT     21H
  196. ;┌─────────────────────────────────────────────────────────────────────────────┐
  197. ;│           MOVE PICTURE DATA BETWEEN FILES                       │
  198. ;└─────────────────────────────────────────────────────────────────────────────┘
  199. READ_BLOCK:
  200. ;┌─────────────────────────────────────────────────────────────────────────────┐
  201. ;│           CALCULATE NUMBER OF LINES PER 8K BUFFER                   │
  202. ;└─────────────────────────────────────────────────────────────────────────────┘
  203.            MOV     AX,8000H
  204.            MOV     CX,IMG_WIDTH_BYTE
  205.            XOR     DX,DX
  206.            DIV     CX               ;AX = NUMBER OF LINES IN BUFFER
  207.            MOV     LINES_PER_BUFF,AX
  208.            MUL     CX               ;GET BUFFER SIZE
  209.            MOV     BUFF_SIZE,AX           ;
  210. ;┌─────────────────────────────────────────────────────────────────────────────┐
  211. ;│           CALCULATE NUMBER OF FILE READS                       │
  212. ;└─────────────────────────────────────────────────────────────────────────────┘
  213.            MOV     CX,LINES_PER_BUFF       ;
  214.            MOV     AX,IMG_HEIGHT           ;LINES/LINES PER BUFFER
  215.            XOR     DX,DX               ;
  216.            DIV     CX               ;AX = NUMBER OF READS
  217.            INC     AX
  218.            MOV     NUMBER_READS,AX           ;SAVE
  219. ;┌─────────────────────────────────────────────────────────────────────────────┐
  220. ;│           POSITION FILE POINTER .....FIRST READ                   │
  221. ;└─────────────────────────────────────────────────────────────────────────────┘
  222.            DEC     AX
  223.            MOV     CX,BUFF_SIZE
  224.            MUL     CX               ;DX:AX = OFFSET
  225.  
  226.            MOV     CX,DX               ;OFFSETS
  227.            MOV     DX,AX               ;
  228.            MOV     AH,42H               ;MOVE FILE POINTER
  229.            MOV     AL,1               ;FROM PRESENT LOCATION
  230.            MOV     BX,HANDLE_IN           ;
  231.            INT     21H               ;DX:AX = PRESENT LOCATION
  232. PF100:
  233.            CALL    PROCESS_PAC           ;
  234.            DEC     NUMBER_READS
  235.            JZ      CLOSE_FILE
  236.            JS      CLOSE_FILE
  237.            SUB     AX,BUFF_SIZE
  238.            JNc     PF200
  239.            DEC     DX
  240. PF200:
  241.            MOV     CX,DX               ;OFFSETS
  242.            MOV     DX,AX               ;
  243.            MOV     AH,42H               ;MOVE FILE POINTER
  244.            MOV     AL,0               ;FROM BEGINNING OF FILE
  245.            MOV     BX,HANDLE_IN           ;
  246.            INT     21H               ;DX:AX = PRESENT LOCATION
  247.            JMP     SHORT PF100
  248. ;┌─────────────────────────────────────────────────────────────────────────────┐
  249. ;│           CLOSE FILES                               │
  250. ;└─────────────────────────────────────────────────────────────────────────────┘
  251. CLOSE_FILE:
  252.            MOV     BX,HANDLE_IN           ;CLOSE FILE
  253.            MOV     AH,3EH               ;
  254.            INT     21H               ;
  255.            MOV     BX,HANDLE_OUT           ;CLOSE FILE
  256.            MOV     AH,3EH               ;
  257.            INT     21H               ;
  258.            JMP     EXIT
  259. ERROR:
  260.            MOV     AX,CS
  261.            MOV     DS,AX
  262.            MOV     AH,9
  263.            INT     21H
  264. EXIT:
  265.            CALL    BREAK_OFF           ;BREAK KEY RESET
  266.            RET                   ;
  267. MAIN           ENDP
  268.  
  269. ;╔═════════════════════════════════════════════════════════════════════════════╗
  270. ;║ ░░░░░░░░░░░ PROCESS PACKET ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  271. ;╚═════════════════════════════════════════════════════════════════════════════╝
  272. PROCESS_PAC    PROC    NEAR
  273.  
  274.            PUSH    AX
  275.            CALL    IMG_READ
  276.            CALL    REVERSE_LINES
  277.            MOV     CX,AX               ;SIZE OF BUFFER
  278.            CALL    IMG_WRITE
  279.            POP     AX
  280.            RET
  281.  
  282. PROCESS_PAC    ENDP
  283. ;╔═════════════════════════════════════════════════════════════════════════════╗
  284. ;║ ░░░░░░░░░░░ REVERSE LINES ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  285. ;╚═════════════════════════════════════════════════════════════════════════════╝
  286. ;┌─────────────────────────────────────────────────────────────────────────────┐
  287. ;│           AX=NUMBER OF CHARACTERS IN BUFFER                   │
  288. ;└─────────────────────────────────────────────────────────────────────────────┘
  289. REVERSE_LINES  PROC    NEAR
  290.  
  291.            PUSH    AX               ;SAVE REGISTERS
  292.            PUSH    BX               ;
  293.            PUSH    CX               ;
  294.            PUSH    DX               ;
  295.            PUSH    DI               ;
  296.            PUSH    SI               ;
  297.            PUSH    DS               ;
  298.            PUSH    ES               ;
  299.  
  300.            STD
  301.            LES     DI,DISK_BUFFER           ;
  302.            ADD     DI,8000H            ;SECOND BUFFER
  303.            LDS     SI,DISK_BUFFER           ;
  304.            ADD     SI,AX               ;GO TO END OF BUFFER
  305.  
  306.            MOV     CX,CS:IMG_WIDTH_BYTE     ;GET BYTES PER LINE
  307.            XOR     DX,DX
  308.            DIV     CX               ;GET NUMBER OF LINES
  309.            MOV     CX,AX               ;NUMBER OF LOOPS
  310. RL100:
  311.            PUSH    CX
  312.            ADD     DI,CS:IMG_WIDTH_BYTE
  313.            PUSH    DI
  314.            MOV     CX,CS:IMG_WIDTH_BYTE    ;NUMBER OF BYTES TO MOVE
  315.            REP     MOVSB               ;MOVE LINE
  316.            POP     DI
  317.            POP     CX
  318.            LOOP    RL100
  319.            CLD
  320.  
  321.            POP     ES               ;RESTORE REGISTERS
  322.            POP     DS               ;
  323.            POP     SI               ;
  324.            POP     DI               ;
  325.            POP     DX               ;
  326.            POP     CX               ;
  327.            POP     BX               ;
  328.            POP     AX               ;
  329.            RET
  330. REVERSE_LINES  ENDP
  331. ;╔═════════════════════════════════════════════════════════════════════════════╗
  332. ;║ ░░░░░░░░░░░ IMAGE READ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  333. ;╚═════════════════════════════════════════════════════════════════════════════╝
  334. ;┌─────────────────────────────────────────────────────────────────────────────┐
  335. ;│           READ  IMAGE FILE                            │
  336. ;└─────────────────────────────────────────────────────────────────────────────┘
  337. IMG_READ       PROC    NEAR
  338.  
  339.            PUSH    BX               ;
  340.            PUSH    CX               ;
  341.            PUSH    DX               ;
  342.            PUSH    DS
  343.  
  344.            MOV     AH,3FH               ;
  345.            MOV     BX,HANDLE_IN           ;
  346.            MOV     CX,BUFF_SIZE           ;
  347.            LDS     DX,DISK_BUFFER           ;
  348.            INT     21H               ;
  349.  
  350.            POP     DS
  351.            POP     DX               ;RESTORE REGISTERS
  352.            POP     CX               ;
  353.            POP     BX               ;
  354.            RET
  355.  
  356. IMG_READ       ENDP
  357. ;╔═════════════════════════════════════════════════════════════════════════════╗
  358. ;║ ░░░░░░░░░░░ IMAGE WRITE ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  359. ;╚═════════════════════════════════════════════════════════════════════════════╝
  360. ;┌─────────────────────────────────────────────────────────────────────────────┐
  361. ;│           WRITE IMAGE FILE                            │
  362. ;└─────────────────────────────────────────────────────────────────────────────┘
  363. IMG_WRITE      PROC    NEAR
  364.  
  365.            PUSH    AX               ;SAVE REGISTERS
  366.            PUSH    BX               ;
  367.            PUSH    CX               ;
  368.            PUSH    DX               ;
  369.            PUSH    DS
  370.  
  371.            MOV     AH,40H               ;
  372.            MOV     BX,HANDLE_OUT           ;
  373.            LDS     DX,DISK_BUFFER           ;
  374.            ADD     DX,8000H
  375.            INT     21H               ;
  376.  
  377.            POP     DS
  378.            POP     DX               ;RESTORE REGISTERS
  379.            POP     CX               ;
  380.            POP     BX               ;
  381.            POP     AX               ;
  382.            RET
  383.  
  384. IMG_WRITE      ENDP
  385. ;┌─────────────────────────────────────────────────────────────────────────────┐
  386. ;└─────────────────────────────────────────────────────────────────────────────┘
  387. EOI          EQU      20H              ;END OF INTERRUPT
  388. BRKINT          EQU      1BH              ;BREAK INTERRUPT
  389. SAV_BRK       DW       ?
  390. ;╔═════════════════════════════════════════════════════════════════════════════╗
  391. ;║ ░░░░░░░░░░ BREAK_ON ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  392. ;╚═════════════════════════════════════════════════════════════════════════════╝
  393.           PUBLIC   BREAK_ON
  394. BREAK_ON      PROC     NEAR
  395.           PUSH     AX
  396.           PUSH     BX               ;SAVE REGISTERS
  397.           PUSH     CX               ;
  398.           PUSH     DX               ;
  399.           PUSH     SI               ;
  400.           PUSH     ES               ;
  401.  
  402.           XOR      BX,BX               ;SEGMENT 0
  403.           MOV      ES,BX               ;
  404.           MOV      SI,BRKINT*4           ;OFFSET OF INTERUPT VECTOR
  405.  
  406.           MOV      CX,ES:WORD PTR[SI]      ;OFFSET OF CURRENT VECT
  407.           MOV      DX,ES:WORD PTR[SI+2]    ;SEGMENT OF CURRENT VECT
  408.           MOV      CS:SAV_BRK,CX           ;SAVE OFFSET
  409.           MOV      CS:SAV_BRK+2,DX           ;SAVE SEGMENT
  410.  
  411.           MOV      AX,OFFSET BREAK           ;
  412.           CLI                   ;NO INTERRUPTS
  413.           MOV      ES:WORD PTR[SI],AX      ;SET OFFSET
  414.           MOV      AX,CS               ;SET THIS CODE SEGMENT
  415.           MOV      ES:WORD PTR[SI+2],AX    ;MOVE SEG ADDR TO INT.VECT
  416.           STI                   ;INTERRUPTS BACK ON
  417.  
  418.           POP      ES               ;RESTORE REGISTERS
  419.           POP      SI               ;
  420.           POP      DX               ;
  421.           POP      CX               ;
  422.           POP      BX               ;
  423.           POP      AX               ;
  424.           RET                   ;
  425. BREAK_ON      ENDP
  426. ;╔═════════════════════════════════════════════════════════════════════════════╗
  427. ;║ ░░░░░░░░░░ BREAK_OFF ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  428. ;╚═════════════════════════════════════════════════════════════════════════════╝
  429.           PUBLIC   BREAK_OFF
  430. BREAK_OFF     PROC     NEAR
  431.  
  432.           PUSH     AX               ;
  433.           PUSH     CX               ;
  434.           PUSH     DX               ;
  435.           PUSH     DI               ;
  436.           PUSH     ES               ;
  437.  
  438.           XOR      AX,AX               ;
  439.           MOV      ES,AX               ;SEGMENT 0
  440.           MOV      CX,CS:SAV_BRK           ;RESET VECTOR BACK TO OLD RTN
  441.           MOV      DX,CS:SAV_BRK+2           ;
  442.           MOV      DI,BRKINT*4           ;
  443.           CLI                   ;NO INTERRUPTS
  444.           MOV      ES:WORD PTR[DI],CX      ;
  445.           MOV      ES:WORD PTR[DI+2],DX    ;
  446.           STI                   ;INTERRUPTS BACK ON
  447.  
  448.           POP      ES               ;
  449.           POP      DI               ;
  450.           POP      DX               ;
  451.           POP      CX               ;
  452.           POP      AX               ;
  453.           RET                   ;
  454. BREAK_OFF     ENDP
  455. ;╔═════════════════════════════════════════════════════════════════════════════╗
  456. ;║ ░░░░░░░░░░ BREAK ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║ J
  457. ;╚═════════════════════════════════════════════════════════════════════════════╝
  458.           PUBLIC   BREAK
  459. BREAK          PROC     FAR
  460.  
  461.           MOV      AX,CS
  462.           MOV      DS,AX
  463.           MOV      AL,EOI               ;
  464.           OUT      020H,AL               ;
  465.           CALL     BREAK_OFF
  466.           MOV      SP,OFFSET STACK-4       ;
  467.           RET
  468.  
  469. BREAK          ENDP
  470. ;┌─────────────────────────────────────────────────────────────────────────────┐
  471. ;└─────────────────────────────────────────────────────────────────────────────┘
  472.            DB      64 DUP('STACK')
  473. STACK           EQU     $
  474. PROG_END       EQU     $
  475. CSEG           ENDS
  476.            END     MAIN
  477.